/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio;

import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.JugadorDetalle;

/**
 *
 * @author Administrador
 */
public class Disparo {

    // seteables
    private double anguloRemateHorizontal = 0;
    private int indiceRematador = -1;
    
    // no seteables
    private double anguloRemateVertical = 0;
    private double factorRemate = 0;

    public double getFactorRemate() {
        return factorRemate;
    }
    public double getAnguloRemateVertical() {
        return anguloRemateVertical;
    }
    
    private static int[][][] fuerzas = 
    {
        // 1.5
        {{31,59}},
        // 1.6
        {{28,38}},
        // 1.7
        {{26,33},{34,56}},
        // 1.8
        {{25,30},{31,59}},
        // 1.9
        {{23,27},{28,35},{36,54}},
        // 2.0
        {{21,25},{26,32},{33,57}},
        // 2.1
        {{20,23},{24,29},{30,38},{39,51}},
        // 2.2
        {{19,22},{23,27},{28,34},{35,55}},
        // 2.3
        {{18,21},{22,25},{26,31},{32,41}},
        // 2.4
        {{17,20},{21,24},{25,29},{30,35}}
    };
    
    private static int[][] constantes = {
        {6,7},{4,11},{3,14},{3,16}
    };
    
    public double getAnguloRemateHorizontal() {
        return anguloRemateHorizontal;
    }

    public void setAnguloRemateHorizontal(double anguloRemateHorizontal) {
        this.anguloRemateHorizontal = anguloRemateHorizontal;
    }




    public int getIndiceRematador() {
        return indiceRematador;
    }

    public void setIndiceRematador(int indiceRematador) {
        this.indiceRematador = indiceRematador;
    }

    public static int[] getAngulos(double fuerza, int cte) {
                
        int posFuerza = (int)(fuerza/0.1)-12;
        return fuerzas[posFuerza][cte];
    }
    public static int[] getAngulos(int posFuerza, int cte) {
        return fuerzas[posFuerza][cte];
    }
    
    public boolean set(double distancia, JugadorDetalle detalleRematador){
        for (int cte=constantes.length-1;cte>-1;cte--) {
            for (int n=0;n<2;n++) {
                
                int k = constantes[cte][n];
                double a = getConstante(k);
            
                for (int fuerza=9;fuerza>-1;fuerza--) {
                    if (fuerzas[fuerza].length<=cte) continue;
                    int[] angulos = getAngulos(fuerza, cte);
                    
                    // a = f * cos angulo
                    double fuerzaReal = fuerza*0.1 + 1.5;
                    double coseno = distancia/(a*fuerzaReal);
                    if (coseno>1) break;
                    double angulo = Math.acos(coseno)*180/Math.PI;
                    boolean esCorrecto = (angulo>=angulos[0] && angulo<= angulos[1]);
                    if (esCorrecto){
                        
                        
                        setFactorRemate(fuerzaReal, detalleRematador.getRemate());
                        
          //              System.out.println("a="+a+";k="+k+";fuerzaReal="+fuerzaReal+";angulo="+angulo+";factorRemate="+factorRemate);
                        
                        anguloRemateVertical  = angulo;
                        return true;
                    }
                }
            }
        }
        return false;
    }
    public void setFactorRemate(double fuerzaReal, double remate) {
        double fuerzaRematador = Constantes.getVelocidadRemate(remate);
        factorRemate = fuerzaReal/fuerzaRematador;
    }
    // fuerza entre 0 y 1
    private boolean esAnguloCorrecto(int[]angulos,double a, int fuerza){
        // a = f * cos angulo
        double fuerzaReal = fuerza*0.1 + Constantes.REMATE_VELOCIDAD_MIN;
        double coseno = a/fuerzaReal;
        double angulo = Math.acos(coseno)*180/Math.PI;
        return (angulo>=angulos[0] && angulo<= angulos[1]);
    }
    
    private double getConstante(int n) {
        return (1-Math.pow(Constantes.FACTOR_DISMINUCION_VEL_BALON_AIRE,n))/
                (1-Constantes.FACTOR_DISMINUCION_VEL_BALON_AIRE);
    }
}
